package com.sms.common.persistence;

import java.io.Serializable;

import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDHexGenerator;

/**
 * 继承Hibernate的UUIDGenerator, 将GUID长度缩短到18位. UUID主要用于同时使用多个数据库,不能依赖单个数据库自增生成主键的情形. 
 * 1. 获取ip后两位
 * 2. 时间戳-沿用原算法. 
 * 3. Count - 相同JVM同一毫秒内的计数器,长度减为2. 全部使用Hex编码.
 * @author WuJiangWu
 * @date 2018年7月15日
 */
public class UIDGenerator extends UUIDHexGenerator {
    
	private String sep = "";//分隔符

	@Override
	public Serializable generate(SharedSessionContractImplementor session, Object obj) {
		return format2( getIP() ) + sep
				+ format( getHiTime() ) + sep
				+ format( getLoTime() ) + sep
				+ formatShort( getCount() );
	}

    /**
     * 格式化最大值为255的数值成长度为2的字符串.
     * @param value xx
     * @return xx
     */
    protected String formatShort(short value) {
        String formatted = Integer.toHexString(value);
        if (formatted.length() < 2) {
            formatted = "0" + formatted;
        }
        return formatted;
    }
    
    protected String format2(int intValue) {
		String formatted = Integer.toHexString( intValue );
		if (formatted.length() > 2) {
            formatted = formatted.substring(formatted.length()-2,formatted.length());
        }
		return formatted;
	}
    
    /**
     * 获取短id
     * @return
     */
    public static String getUUId(){
    	UIDGenerator u = new UIDGenerator();
    	String id = u.format2( u.getIP() ) + u.sep
		+ u.format( u.getHiTime() ) + u.sep
		+ u.format( u.getLoTime() ) + u.sep
		+ u.formatShort( u.getCount() );
    	return id.toUpperCase();
    }
    
    public static void main(String[] args) {
  		System.out.println("=======");
  		System.out.println(getUUId());
  	}
}
